﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;

namespace iRobotController.UnitTests
{
    [TestFixture]
    public class HWFaultTolerenceTests
    {
        private HWFaultTolerence _hwFaultTolerence;
        private readonly TimeSpan _faultTimeTolerence = new TimeSpan(0, 0, 0, 0, 100);
        private readonly TimeSpan _faultTimeTolerenceReset = new TimeSpan(0, 0, 0, 0, 500);
        private readonly TimeSpan _oneMilliSeconds = new TimeSpan(0, 0, 0, 0, 1);
        private DateTime _startTime;

        [SetUp]
        public void Setup()
        {
            _hwFaultTolerence = new HWFaultTolerence(_faultTimeTolerence, _faultTimeTolerenceReset);
            _startTime = DateTime.Now;
        }

        [Test, ExpectedException(typeof(ArgumentException))]
        public void ctor_FaultTimeTolerenceLargerThanFaultTolerenceTime_Exception()
        {
            _hwFaultTolerence = new HWFaultTolerence(_faultTimeTolerenceReset,_faultTimeTolerence);
        }

        [Test]
        public void HasFaultTolerenceThresholdBeenReached_FirstCall_False()
        {
            Assert.IsFalse(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime));
        }

        [Test]
        public void HasFaultTolerenceThresholdBeenReached_WithinTolerence_False()
        {
            Assert.IsFalse(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime));
            Assert.IsFalse(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime.Add(_faultTimeTolerence).Subtract(_oneMilliSeconds)));
        }

        [Test]
        public void HasFaultTolerenceThresholdBeenReached_OutSideTolerence_True()
        {
            Assert.IsFalse(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime));
            Assert.IsTrue(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime.Add(_faultTimeTolerence).Add(_oneMilliSeconds)));
        }

        [Test]
        public void HasFaultTolerenceThresholdBeenReached_AfterTolerenceReset_False()
        {
            Assert.IsFalse(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime));
            Assert.IsFalse(_hwFaultTolerence.HasFaultTolerenceThresholdBeenReached(_startTime.Add(_faultTimeTolerenceReset).Add(_oneMilliSeconds)));
        }

    }
}
